// 
// AspNetParsingTests.cs
//  
// Author:
//       Michael Hutchinson <mhutchinson@novell.com>
// 
// Copyright (c) 2009 Novell, Inc. (http://www.novell.com)
// 
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// 
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
// 
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.

using System.Linq;
using MonoDevelop.AspNet.Tests.Html;
using MonoDevelop.AspNet.WebForms.Dom;
using MonoDevelop.AspNet.WebForms.Parser;
using MonoDevelop.Xml.Dom;
using MonoDevelop.Xml.Parser;
using MonoDevelop.Xml.Tests.Parser;
using NUnit.Framework;

namespace MonoDevelop.AspNet.Tests.WebForms
{
	[TestFixture]
	class WebFormsParsingTests : HtmlParsingTests
	{
		public override XmlRootState CreateRootState ()
		{
			return new WebFormsRootState ();
		}

		[Test]
		public void Directives ()
		{
			var parser = new TestXmlParser (CreateRootState (), true);
			parser.Parse (@"<%@ Page Language=""C#"" Inherits=""SomeGenericType<int>"" %>");
			parser.AssertNoErrors ();
			var doc = (XDocument) parser.Nodes.Peek ();
			var directive = doc.Nodes.First () as WebFormsDirective;
			Assert.NotNull (directive);
			Assert.AreEqual ("Page", directive.Name.FullName);
			Assert.AreEqual (2, directive.Attributes.Count ());
			var att = directive.Attributes[0];
			Assert.AreEqual ("Language", att.Name.FullName);
			Assert.AreEqual ("C#", att.Value);
			att = directive.Attributes[1];
			Assert.AreEqual ("Inherits", att.Name.FullName);
			Assert.AreEqual ("SomeGenericType<int>", att.Value);
		}

		[Test]
		public void AttributeWithExpression ()
		{
			var parser = new TestXmlParser (CreateRootState (), true);
			parser.Parse (@"<tag
foo='<%=5$%>'
bar=""<%$$5$%><%--$--%>""
baz='<%#5$%>=<%:fhfjhf %0 $%>'
quux = <% 5 $%>  />", delegate {
				parser.AssertNodeIs<WebFormsRenderExpression> ();
			}, delegate {
				parser.AssertNodeIs<WebFormsResourceExpression> ();
			}, delegate {
				parser.AssertNodeIs<WebFormsServerComment> ();
			}, delegate {
				parser.AssertNodeIs<WebFormsBindingExpression> ();
			}, delegate {
				parser.AssertNodeIs<WebFormsHtmlEncodedExpression> ();
			}, delegate {
				parser.AssertNodeIs<WebFormsRenderBlock> ();
			});
			parser.AssertNoErrors ();
		}
	}
}
